package ntd.util.frame.task.handle.fm;

import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.cron.CronUtil;
import com.c.opt.ComOpt;
import com.ToolOpt;
import com.modular.iot.bo.IotModelBo;
import com.modular.iot.bo.IotData;
import com.modular.iot.bo.IotDataItem;
import ntd.Init;
import ntd.action.bo.ActionInBo;
import ntd.task.Task;
import ntd.task.bo.TaskInfo;
import ntd.util.frame.task.handle.fm.util.ToolJsyData;
import ntd.util.frame.task.handle.fm.util.ToolFmData;
import ntd.util.modular.things.entity.DeviceData;
import ntd.util.modular.things.entity.DeviceDataItem;
import ntd.util.util.ToolDuration;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FmDataJsyPush implements Task {

    private ComOpt<DeviceData> deviceDataComOpt = ToolOpt.OPT_T_D_DATA;
    private ComOpt<DeviceDataItem> deviceDataItemComOpt = ToolOpt.OPT_T_D_D_ITEM;

    @Override
    public TaskInfo info() {
        return new TaskInfo("富铭-数据转换任务-金山云", "task-fm-data-push-jsy", new FmDataJsyPush());
    }

    @Override
    public void execute(Object o) {
        ToolDuration.duration(() -> {
            // 数据采集数据转换到设备数据 - 基础平台
            List<IotModelBo> iotModelBo = ToolJsyData.getIotBo();
            for (IotModelBo bo : iotModelBo) {
                ToolOpt.OPT_T_DATA.saveIot(bo);
            }
            // 实时生成小时数据 - 开放平台
            handle(String.valueOf(o));
        }, "金山云-数据转换");
    }

    private void handle(String dateTime) {
        // 查找时间范围内最近时间节点的数据
        List<DeviceData> deviceDataList = deviceDataComOpt.query().ge("report_time", DateUtil.offsetHour(DateUtil.parse(dateTime), -24).toStringDefaultTimeZone()).eq("st", "61").listBean();
        // 遍历24小时内需要同步的数据
        for (DeviceData deviceData : deviceDataList) {
            IotData iotData = IotData.transformComPlatform(deviceData);
            iotData.setCn("2061");
            iotData.setReportTime(DateUtil.parseLocalDateTime(dateTime));
            // 查询详情数据
            List<DeviceDataItem> deviceDataItems = deviceDataItemComOpt.query().eq("data_id", deviceData.getId()).listBean();
            // 查询子项数据
            iotData.setIotDataItems(CollStreamUtil.toList(deviceDataItems, IotDataItem::transformComPlatform));
            // 富铭开放平台数据推送
            ToolFmData.OPT_FM_DATA.pushData(iotData);
        }
    }

    public static void main(String[] args) {
        FmDataJsyPush fmDataJsyPush = new FmDataJsyPush();

        DateTime date = DateUtil.parse("2023-11-27 10:00:00");
        for (int i = 0; i < 30; i++) {
            date = DateUtil.offsetHour(date, -2);
            fmDataJsyPush.execute(DateUtil.formatDateTime(date));
        }

//        CronUtil.schedule("0 */2 * * *", (Runnable) () -> fmDataJsyPush.execute(DateUtil.formatDateTime(DateUtil.date())));
//
//        Init.init();
    }
}
